Fishing Optimal Control

We will solve an optimal control problem to maximize profit constrained by fish population.

Problem Statement and Model

In this system, our input is the fishing rate $u$, and the profit $J$ will be defined in the objective to maximize. Our profit objective is represented as:

\[\begin{aligned} &&\max_{u(t)} J(t) \\ &&&&&J = \int_0^{10} \left(E - \frac{c}{x}\right) u U_{max} \, dt \\ &&\text{s.t.} &&& \frac{dx}{dt}= rx(t)\left(1 - \frac{x(t)}{k}\right) - uU_{max}, t \in [0,10] \\ &&&&&x(0) = 70 \\ &&&&&0 \leq u(t) \leq 1 \\ &&&&&E = 1, \; c = 17.5, \; r = 0.71, \; k = 80.5, \; U_{max} = 20 \\ &&&&&J(0) = 0 \\ \end{aligned}\]

Modeling in InfiniteOpt

First we must import $InfiniteOpt$ and other packages.

using InfiniteOpt, Ipopt, Plots;

Next we specify our initial conditions and problem variables.

x0 = 70
E, c, r, k, Umax = 1, 17.5, 0.71, 80.5, 20;

Model Initialization

We initialize the infinite model with InfiniteModel and select Ipopt as our optimizer that will be used to solve it.

m = InfiniteModel(Ipopt.Optimizer);

Infinite Parameter Definition

We now define the infinite parameter $t \in [0, 10]$ to represent time over a 10 year period. We'll also specify 100 equidistant time points.

@infinite_parameter(m, t in [0, 10], num_supports=100)
t

Infinite Variable Definition

Now that we have our infinite parameter defined, let's specify our infinite variables:

  • $1 \leq x(t)$ : fish population at time $t$
  • $0 \leq u(t) \leq 1$ : fishing rate
  • $J(t)$ : profit over time
@variable(m, 1 <= x, Infinite(t))
@variable(m, 0 <= u <= 1, Infinite(t));
@variable(m, J, Infinite(t));

Objective Definition

Now we add the objective using @objective to maximize profit $J$ at the end of the 10 year period:

@objective(m, Max, J(10));

Constraint Definition

The last step is to add our constraints. First, define the ODEs which serve as our system model.

@constraint(m, ∂(J,t) == (E-c/x) * u * Umax)
@constraint(m, ∂(x,t) == r * x *(1 - x/k) - u*Umax);

We also set our initial conditions for $x$ and $J$.

@constraint(m, x(0) == x0)
@constraint(m, J(0) == 0);

Problem Solution

Now we're ready to solve! We can solve the model by invoking optimize!:

optimize!(m)

******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
 Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit https://github.com/coin-or/Ipopt
******************************************************************************

This is Ipopt version 3.14.17, running with linear solver MUMPS 5.8.0.

Number of nonzeros in equality constraint Jacobian...:     1296
Number of nonzeros in inequality constraint Jacobian.:        0
Number of nonzeros in Lagrangian Hessian.............:      400

Total number of variables............................:      500
                     variables with only lower bounds:      100
                variables with lower and upper bounds:      100
                     variables with only upper bounds:        0
Total number of equality constraints.................:      400
Total number of inequality constraints...............:        0
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  0.0000000e+00 6.90e+01 1.45e+00  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1 -1.8548441e+00 6.89e+01 1.12e+01  -1.0 9.50e+03  -2.0 1.44e-04 1.76e-03h  1
   2 -2.6101623e+00 6.88e+01 1.12e+01  -1.0 3.84e+03  -1.6 3.43e-04 7.39e-04h  1
   3 -8.1519321e+00 6.85e+01 5.40e+01  -1.0 3.34e+03  -2.1 1.00e-03 4.91e-03h  1
   4 -1.5382109e+01 6.80e+01 6.91e+01  -1.0 2.26e+03  -2.5 1.14e-03 7.62e-03f  4
   5 -2.3521800e+01 6.72e+01 6.64e+01  -1.0 2.27e+03    -  1.32e-02 1.07e-02h  3
   6 -3.2524402e+01 6.62e+01 6.32e+01  -1.0 1.67e+03    -  2.84e-02 1.51e-02h  2
   7 -3.9860630e+01 6.51e+01 5.06e+01  -1.0 9.09e+02    -  8.43e-02 1.60e-02h  1
   8 -4.5178330e+01 6.40e+01 3.21e+01  -1.0 2.71e+03    -  3.44e-02 1.70e-02h  1
   9 -4.9707626e+01 6.30e+01 3.08e+01  -1.0 1.38e+03    -  1.50e-02 1.62e-02h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10 -5.3966386e+01 6.19e+01 3.24e+01  -1.0 2.10e+03    -  1.11e-02 1.72e-02h  1
  11 -5.5735727e+01 6.14e+01 3.15e+01  -1.0 3.23e+03    -  1.00e-02 9.14e-03h  1
  12 -5.7438744e+01 6.07e+01 3.26e+01  -1.0 2.39e+03    -  7.16e-03 1.01e-02f  1
  13 -5.6890891e+01 6.02e+01 3.64e+01  -1.0 4.84e+03    -  2.54e-03 8.82e-03f  1
  14 -5.6868789e+01 5.97e+01 3.60e+01  -1.0 1.10e+04    -  2.31e-03 7.95e-03f  2
  15 -5.7110966e+01 5.95e+01 3.69e+01  -1.0 1.97e+03  -2.1 3.18e-03 3.64e-03h  1
  16 -5.9420322e+01 5.84e+01 4.18e+01  -1.0 1.70e+03  -2.6 3.38e-03 1.82e-02f  1
  17 -5.9499934e+01 5.83e+01 3.16e+01  -1.0 1.14e+03  -2.2 1.21e-02 1.23e-03h  1
  18 -6.0120020e+01 5.75e+01 4.82e+01  -1.0 1.34e+03  -1.7 8.68e-03 1.48e-02h  1
  19 -6.0855779e+01 5.70e+01 4.78e+01  -1.0 1.92e+03  -2.2 5.24e-03 8.16e-03f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20 -6.0963105e+01 5.69e+01 3.59e+01  -1.0 2.14e+03  -1.8 6.02e-03 1.80e-03f  1
  21 -7.3097707e+01 5.62e+01 4.14e+01  -1.0 2.01e+03  -2.3 1.80e-03 1.27e-02f  1
  22 -7.3128657e+01 5.61e+01 1.23e+02  -1.0 1.21e+03  -0.9 8.10e-03 1.26e-03h  1
  23 -7.3128597e+01 5.61e+01 1.53e+03  -1.0 2.73e+03  -0.5 8.41e-03 9.58e-05h  1
  24 -7.3194925e+01 5.46e+01 7.12e+02  -1.0 3.17e+03  -1.0 7.53e-03 2.73e-02f  1
  25 -7.3257003e+01 5.42e+01 8.00e+02  -1.0 9.45e+02  -0.6 3.10e-02 7.73e-03f  1
  26 -7.3260596e+01 5.41e+01 6.85e+02  -1.0 1.39e+03  -1.0 3.96e-02 5.10e-04h  1
  27 -7.3243186e+01 5.33e+01 4.89e+03  -1.0 1.62e+03  -0.6 9.60e-02 1.49e-02h  1
  28 -7.3562368e+01 5.20e+01 4.65e+03  -1.0 9.38e+02  -1.1 3.48e-02 2.43e-02f  1
  29 -7.3562755e+01 5.19e+01 4.54e+03  -1.0 7.25e+02  -0.7 1.17e-01 1.67e-03h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30 -7.3601728e+01 5.06e+01 2.75e+03  -1.0 8.08e+02  -1.1 2.21e-01 2.56e-02f  1
  31 -7.3564204e+01 4.97e+01 2.75e+03  -1.0 6.83e+02  -0.7 1.07e-01 1.85e-02h  1
  32 -7.3354094e+01 4.83e+01 2.33e+03  -1.0 7.15e+02  -1.2 8.51e-02 2.78e-02h  1
  33 -7.4140845e+01 4.62e+01 2.38e+03  -1.0 6.32e+02  -1.7 1.86e-02 4.24e-02f  1
  34 -7.4005466e+01 4.58e+01 2.31e+03  -1.0 4.26e+02  -1.2 2.16e-02 1.05e-02h  1
  35 -7.3322754e+01 4.52e+01 2.34e+03  -1.0 6.08e+02  -1.7 1.06e-04 1.22e-02h  2
  36 -7.3322243e+01 4.52e+01 2.34e+03  -1.0 3.86e+02  -0.4 5.12e-02 9.73e-04h  1
  37 -7.3320164e+01 4.51e+01 2.34e+03  -1.0 3.79e+02  -0.9 1.03e-01 2.85e-04h  1
  38 -7.2740602e+01 4.39e+01 2.02e+03  -1.0 5.38e+02  -1.3 1.35e-01 2.71e-02h  1
  39 -7.1495073e+01 4.25e+01 1.90e+03  -1.0 7.55e+02  -1.8 4.60e-02 3.14e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40 -7.1303911e+01 4.22e+01 1.70e+03  -1.0 4.84e+02  -1.4 1.68e-01 7.67e-03h  1
  41 -6.9076921e+01 4.05e+01 1.72e+03  -1.0 7.80e+02  -1.9 8.19e-03 4.05e-02f  1
  42 -6.8670722e+01 4.00e+01 1.71e+03  -1.0 5.03e+02  -1.4 2.03e-03 1.20e-02h  1
  43 -6.8670014e+01 3.99e+01 1.64e+03  -1.0 4.17e+02  -1.0 4.93e-02 1.68e-03h  1
  44 -6.8217569e+01 3.94e+01 1.64e+03  -1.0 5.28e+02  -1.5 9.93e-04 1.35e-02h  1
  45 -6.8217573e+01 3.94e+01 1.06e+03  -1.0 4.19e+02  -1.1 4.44e-01 5.86e-04h  1
  46 -6.7829649e+01 3.88e+01 1.04e+03  -1.0 5.65e+02  -1.5 2.23e-02 1.55e-02h  1
  47 -6.7829414e+01 3.88e+01 1.09e+03  -1.0 2.40e+02  -1.1 9.39e-02 4.31e-05h  1
  48 -6.7135068e+01 3.79e+01 1.03e+03  -1.0 5.82e+02  -1.6 6.14e-02 2.20e-02h  1
  49 -6.5035447e+01 3.67e+01 9.60e+02  -1.0 8.39e+02  -2.1 4.68e-02 3.15e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  50 -6.4843797e+01 3.65e+01 9.09e+02  -1.0 4.02e+02  -1.6 6.57e-02 5.60e-03h  1
  51 -6.3479506e+01 3.59e+01 9.31e+02  -1.0 1.20e+03  -2.1 4.71e-05 1.66e-02f  1
  52 -6.3548816e+01 3.59e+01 9.27e+02  -1.0 6.76e+02  -1.7 3.76e-03 1.92e-03h  1
  53 -6.3548598e+01 3.59e+01 8.86e+02  -1.0 2.83e+02  -1.3 1.16e-01 4.52e-05h  1
  54 -6.3285066e+01 3.56e+01 8.70e+02  -1.0 7.53e+02  -1.7 6.38e-02 5.79e-03h  1
  55 -6.2051582e+01 3.50e+01 8.07e+02  -1.0 1.27e+03  -2.2 4.25e-02 1.71e-02f  1
  56 -6.1758101e+01 3.48e+01 8.47e+02  -1.0 9.05e+02  -1.8 1.03e-01 5.92e-03h  1
  57 -6.0328811e+01 3.42e+01 7.88e+02  -1.0 1.52e+03  -2.3 4.52e-02 1.83e-02f  1
  58 -6.0061572e+01 3.40e+01 8.69e+02  -1.0 1.19e+03  -1.8 6.22e-02 4.73e-03h  1
  59 -5.8602031e+01 3.34e+01 8.14e+02  -1.0 1.48e+03  -2.3 4.38e-02 1.88e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  60 -5.8336469e+01 3.32e+01 8.57e+02  -1.0 1.03e+03  -1.9 4.30e-02 5.04e-03h  1
  61 -5.7966898e+01 3.30e+01 1.11e+03  -1.0 1.08e+03  -1.5 3.96e-02 7.77e-03h  1
  62 -5.7078590e+01 3.26e+01 1.09e+03  -1.0 1.81e+03  -1.9 4.27e-02 1.18e-02f  1
  63 -5.6841293e+01 3.25e+01 1.40e+03  -1.0 1.62e+03  -1.5 3.40e-02 3.42e-03h  1
  64 -5.5578931e+01 3.20e+01 1.31e+03  -1.0 2.14e+03  -2.0 6.65e-02 1.41e-02f  1
  65 -5.5291009e+01 3.19e+01 1.68e+03  -1.0 1.88e+03  -1.6 3.86e-02 3.46e-03h  1
  66 -5.3911861e+01 3.14e+01 1.44e+03  -1.0 2.20e+03  -2.1 9.88e-02 1.45e-02f  1
  67 -5.3332039e+01 3.12e+01 1.74e+03  -1.0 2.04e+03  -1.6 3.91e-02 6.27e-03f  1
  68 -5.2104830e+01 3.08e+01 1.44e+03  -1.0 1.95e+03  -2.1 8.01e-02 1.33e-02f  1
  69 -5.1086135e+01 3.05e+01 1.67e+03  -1.0 2.04e+03  -1.7 4.62e-02 1.08e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  70 -4.9970887e+01 3.01e+01 1.47e+03  -1.0 1.51e+03  -2.2 5.01e-02 1.22e-02f  1
  71 -4.8771076e+01 2.97e+01 1.55e+03  -1.0 1.78e+03  -1.7 5.53e-02 1.43e-02f  1
  72 -4.8642430e+01 2.96e+01 2.59e+03  -1.0 1.56e+03  -1.3 5.23e-02 1.61e-03h  1
  73 -4.6434003e+01 2.90e+01 2.63e+03  -1.0 2.25e+03  -1.8 9.89e-02 2.02e-02f  1
  74 -4.6217701e+01 2.90e+01 3.65e+03  -1.0 1.68e+03  -1.4 7.31e-02 2.40e-03h  1
  75 -4.4329808e+01 2.84e+01 3.41e+03  -1.0 1.93e+03  -1.8 6.00e-02 1.89e-02f  1
  76 -4.3910729e+01 2.83e+01 4.24e+03  -1.0 1.68e+03  -1.4 9.38e-02 4.64e-03f  1
  77 -4.2230654e+01 2.78e+01 3.77e+03  -1.0 1.58e+03  -1.9 7.54e-02 1.84e-02f  1
  78 -4.1016603e+01 2.74e+01 4.03e+03  -1.0 1.52e+03  -1.5 8.90e-02 1.46e-02f  1
  79 -3.9161710e+01 2.68e+01 3.58e+03  -1.0 1.61e+03  -1.9 6.91e-02 2.08e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  80 -3.8916774e+01 2.67e+01 3.65e+03  -1.0 8.55e+02  -1.5 8.70e-02 3.47e-03h  1
  81 -3.7317470e+01 2.62e+01 3.22e+03  -1.0 1.76e+03  -2.0 7.60e-02 1.98e-02f  1
  82 -3.6862207e+01 2.60e+01 3.41e+03  -1.0 1.61e+03  -1.6 5.49e-02 5.59e-03f  1
  83 -3.5750281e+01 2.56e+01 4.02e+03  -1.0 1.25e+03  -1.1 5.98e-02 1.73e-02f  1
  84 -3.4943221e+01 2.53e+01 3.81e+03  -1.0 1.80e+03  -1.6 6.55e-02 8.81e-03f  1
  85 -3.3888511e+01 2.49e+01 4.24e+03  -1.0 1.22e+03  -1.2 9.04e-02 1.59e-02f  1
  86 -3.2359512e+01 2.45e+01 3.93e+03  -1.0 1.72e+03  -1.7 4.97e-02 1.73e-02f  1
  87 -3.1972051e+01 2.43e+01 3.77e+03  -1.0 8.77e+02  -1.2 1.38e-01 6.96e-03h  1
  88 -3.0047044e+01 2.38e+01 3.48e+03  -1.0 1.64e+03  -1.7 5.26e-02 2.31e-02f  1
  89 -2.9908135e+01 2.37e+01 4.30e+03  -1.0 1.25e+03  -1.3 1.02e-01 1.88e-03h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  90 -2.8185232e+01 2.32e+01 3.53e+03  -1.0 1.53e+03  -1.8 1.11e-01 2.29e-02f  1
  91 -2.7789946e+01 2.31e+01 4.09e+03  -1.0 1.37e+03  -1.3 8.16e-02 5.38e-03h  1
  92 -2.6406264e+01 2.26e+01 9.61e+02  -1.0 1.32e+03  -1.8 5.21e-01 2.17e-02f  1
  93 -2.5907022e+01 2.23e+01 7.19e+02  -1.0 9.48e+02  -1.4 7.05e-02 1.06e-02h  1
  94 -2.4814415e+01 2.17e+01 1.03e+03  -1.0 6.97e+02  -1.0 8.21e-02 3.00e-02h  1
  95 -2.2729667e+01 2.10e+01 9.91e+02  -1.0 1.42e+03  -1.4 6.88e-02 2.85e-02f  1
  96 -2.2612328e+01 2.10e+01 2.04e+03  -1.0 5.83e+02  -1.0 8.98e-02 2.31e-03h  1
  97 -2.0613290e+01 2.04e+01 1.75e+03  -1.0 1.30e+03  -1.5 9.99e-02 2.97e-02f  1
  98 -2.0476518e+01 2.03e+01 2.98e+03  -1.0 9.70e+02  -1.1 8.89e-02 2.39e-03h  1
  99 -1.8680567e+01 1.97e+01 2.20e+03  -1.0 1.18e+03  -1.5 1.55e-01 2.98e-02f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 100 -1.8426781e+01 1.96e+01 3.23e+03  -1.0 1.00e+03  -1.1 9.40e-02 4.53e-03h  1
 101 -1.6882140e+01 1.90e+01 1.58e+03  -1.0 1.04e+03  -1.6 2.59e-01 2.92e-02f  1
 102 -1.6236404e+01 1.88e+01 2.29e+03  -1.0 9.94e+02  -1.2 8.74e-02 1.22e-02h  1
 103 -1.5089463e+01 1.83e+01 9.94e+02  -1.0 8.25e+02  -1.6 3.29e-01 2.60e-02f  1
 104 -1.3445032e+01 1.76e+01 8.79e+02  -1.0 8.54e+02  -1.2 9.09e-02 3.73e-02h  1
 105 -1.2546694e+01 1.73e+01 9.50e+02  -1.0 1.03e+03  -1.7 9.05e-02 1.96e-02f  1
 106 -1.1886532e+01 1.70e+01 9.13e+02  -1.0 6.28e+02  -1.3 1.07e-01 1.96e-02f  1
 107 -1.0379088e+01 1.63e+01 1.08e+03  -1.0 1.01e+03  -1.7 9.44e-02 3.69e-02f  1
 108 -1.0310464e+01 1.63e+01 8.07e+02  -1.0 6.43e+02  -1.3 6.57e-02 1.86e-03h  1
 109 -9.6672191e+00 1.60e+01 1.24e+03  -1.0 7.16e+02  -0.9 6.49e-02 1.95e-02h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 110 -8.5729304e+00 1.55e+01 8.90e+02  -1.0 7.18e+02  -1.4 1.36e-01 3.13e-02f  1
 111 -8.4995146e+00 1.55e+01 1.91e+03  -1.0 6.59e+02  -0.9 8.53e-02 1.98e-03h  1
 112 -6.4508726e+00 1.47e+01 1.51e+03  -1.0 8.75e+02  -1.4 2.01e-01 4.78e-02f  1
 113 -6.3816741e+00 1.47e+01 2.51e+03  -1.0 5.48e+02  -1.0 1.08e-01 2.05e-03h  1
 114 -4.4117376e+00 1.39e+01 1.48e+03  -1.0 7.90e+02  -1.5 3.84e-01 5.09e-02f  1
 115 -4.2732133e+00 1.39e+01 2.14e+03  -1.0 5.96e+02  -1.0 1.09e-01 4.21e-03h  1
 116 -2.4458467e+00 1.31e+01 1.25e+03  -1.0 6.94e+02  -1.5 3.96e-01 5.37e-02f  1
 117 -2.2052570e+00 1.30e+01 1.49e+03  -1.0 5.73e+02  -1.1 1.11e-01 7.99e-03h  1
 118 -5.6997467e-01 1.23e+01 9.76e+02  -1.0 5.94e+02  -1.6 4.47e-01 5.61e-02f  1
 119 -2.0428884e-01 1.21e+01 9.24e+02  -1.0 5.00e+02  -1.1 1.18e-01 1.46e-02h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 120  1.2183722e+00 1.14e+01 8.64e+02  -1.0 4.95e+02  -1.6 2.11e-01 5.81e-02f  1
 121  1.2941454e+00 1.14e+01 8.12e+02  -1.0 4.36e+02  -1.2 1.33e-01 3.44e-03h  1
 122  3.0173269e+00 1.13e+01 7.29e+02  -1.0 4.95e+02  -1.7 2.47e-01 7.28e-02f  1
 123  3.1855863e+00 1.10e+01 6.60e+02  -1.0 3.71e+02  -1.3 1.34e-01 8.99e-03h  1
 124  4.7735325e+00 1.24e+01 5.97e+02  -1.0 4.18e+02  -1.7 2.06e-01 8.31e-02f  1
 125  4.8266776e+00 1.24e+01 5.27e+02  -1.0 2.73e+02  -1.3 1.53e-01 3.82e-03h  1
 126  6.2951867e+00 1.13e+01 4.92e+02  -1.0 3.62e+02  -1.8 2.12e-01 8.98e-02f  1
 127  6.3766365e+00 1.12e+01 4.37e+02  -1.0 2.48e+02  -1.4 1.74e-01 6.59e-03h  1
 128  7.8907991e+00 1.02e+01 4.01e+02  -1.0 3.20e+02  -1.8 2.61e-01 1.01e-01f  1
 129  7.9299761e+00 1.02e+01 3.45e+02  -1.0 2.11e+02  -1.4 2.28e-01 3.80e-03h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 130  9.8845242e+00 1.01e+01 2.60e+02  -1.0 2.90e+02  -1.9 2.22e-01 1.29e-01f  1
 131  9.9524752e+00 1.00e+01 2.78e+02  -1.0 1.68e+02  -1.5 2.75e-01 7.56e-03h  1
 132  1.2535831e+01 9.23e+00 2.73e+02  -1.0 2.33e+02  -1.9 8.06e-02 1.68e-01f  1
 133  1.2584030e+01 9.17e+00 2.18e+02  -1.0 1.05e+02  -1.5 3.85e-01 6.64e-03h  1
 134  1.3714978e+01 6.14e+00 4.27e+02  -1.0 1.28e+02  -1.1 3.93e-01 1.76e-01h  1
 135  1.4878662e+01 5.85e+00 2.61e+02  -1.0 7.56e+01  -1.6 2.09e-01 1.24e-01f  1
 136  1.4933646e+01 5.79e+00 5.40e+02  -1.0 7.91e+01  -1.1 1.00e+00 9.25e-03h  1
 137  1.8811346e+01 6.48e+00 3.79e+02  -1.0 9.37e+01  -1.6 2.94e-01 3.74e-01f  1
 138  1.8869967e+01 6.37e+00 1.16e+02  -1.0 2.98e+01  -1.2 1.00e+00 1.73e-02h  1
 139  2.4618068e+01 6.46e+00 4.86e+01  -1.0 4.78e+01  -1.7 5.83e-01 6.61e-01f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 140  5.6088394e+01 1.07e+01 7.43e+01  -1.0 3.15e+01  -2.1 3.17e-01 1.00e+00f  1
 141  6.8401142e+01 7.82e+00 3.47e+01  -1.0 1.23e+01  -1.7 4.81e-01 1.00e+00f  1
 142  6.9125304e+01 2.17e+00 6.83e+00  -1.0 4.85e+00  -1.3 8.46e-01 1.00e+00f  1
 143  7.2449832e+01 9.46e-01 7.08e-01  -1.0 5.64e+00  -1.8 8.82e-01 1.00e+00f  1
 144  8.0073894e+01 2.19e+00 3.92e+00  -1.7 7.62e+00  -2.2 5.18e-01 1.00e+00f  1
 145  8.5378975e+01 3.73e+00 4.08e+00  -1.7 1.48e+03    -  4.00e-03 8.65e-03f  1
 146  9.0984727e+01 5.23e+00 4.01e+00  -1.7 1.57e+02    -  4.87e-02 8.88e-02f  1
 147  9.4941272e+01 4.36e+00 2.71e+00  -1.7 2.66e+01    -  3.23e-01 1.69e-01f  1
 148  1.0121743e+02 3.29e+00 2.08e+00  -1.7 5.32e+01    -  1.60e-01 2.43e-01f  1
 149  1.0462559e+02 2.32e+00 1.48e+00  -1.7 2.98e+01    -  3.48e-01 2.84e-01f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 150  1.0631723e+02 1.52e+00 1.00e+00  -1.7 3.36e+01    -  3.44e-01 3.21e-01h  1
 151  1.0690588e+02 1.00e+00 6.65e-01  -1.7 3.81e+01    -  3.03e-01 3.35e-01h  1
 152  1.0698620e+02 7.43e-01 4.79e-01  -1.7 4.61e+01    -  1.00e+00 2.66e-01h  1
 153  1.0657507e+02 1.31e-01 3.90e-03  -1.7 3.85e+00    -  1.00e+00 1.00e+00h  1
 154  1.0664006e+02 2.99e-02 2.23e-03  -2.5 1.57e+00    -  1.00e+00 1.00e+00h  1
 155  1.0678538e+02 7.37e-03 4.11e-03  -3.8 1.12e+00    -  8.96e-01 1.00e+00h  1
 156  1.0679941e+02 2.16e-03 4.46e-05  -3.8 9.67e-01    -  1.00e+00 1.00e+00h  1
 157  1.0680822e+02 8.37e-04 6.41e-04  -5.7 6.66e-01    -  8.54e-01 1.00e+00h  1
 158  1.0680856e+02 1.69e-04 3.04e-05  -5.7 3.32e-01    -  9.83e-01 1.00e+00h  1
 159  1.0680861e+02 3.53e-05 1.64e-07  -5.7 1.96e-01    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
 160  1.0680870e+02 4.30e-06 2.32e-06  -8.6 6.96e-02    -  9.88e-01 1.00e+00h  1
 161  1.0680871e+02 4.99e-08 2.10e-10  -8.6 8.15e-03    -  1.00e+00 1.00e+00h  1
 162  1.0680871e+02 1.39e-11 6.76e-14  -9.0 2.52e-03    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 162

                                   (scaled)                 (unscaled)
Objective...............:  -1.0680870543718251e+02    1.0680870543718251e+02
Dual infeasibility......:   6.7566822382063500e-14    6.7566822382063500e-14
Constraint violation....:   4.2045828098652596e-12    1.3875123272555356e-11
Variable bound violation:   8.8945395493311707e-09    8.8945395493311707e-09
Complementarity.........:   9.1127086454719753e-10    9.1127086454719753e-10
Overall NLP error.......:   9.1127086454719753e-10    9.1127086454719753e-10


Number of objective function evaluations             = 177
Number of objective gradient evaluations             = 163
Number of equality constraint evaluations            = 177
Number of inequality constraint evaluations          = 0
Number of equality constraint Jacobian evaluations   = 163
Number of inequality constraint Jacobian evaluations = 0
Number of Lagrangian Hessian evaluations             = 162
Total seconds in IPOPT                               = 4.026

EXIT: Optimal Solution Found.

Extract and Plot the Results

Now we can extract the optimal results and plot them to visualize how the fish population compares to the profit. Note that the values of infinite variables are returned as arrays corresponding to how the supports were used to discretize our model. We can use the value function to extract the values of the infinite variables.

ts = value(t)
u_opt = value(u)
x_opt = value(x)
J_opt = value(J);

Create the plot for the fish population and profit over time.

p1 = plot(ts, [x_opt, J_opt] ,
    label=["Fish Pop" "Profit"],
    title="State Variables");

Create the plot for the fishing rate over time.

p2 = plot(ts, u_opt,
    label = "Fishing Rate",
    title = "Fishing Rate vs Time");

Visualize the two plots on one figure.

plot(p1,p2 ,layout=(2,1), size=(800,600))

Maintenance Tests

These are here to ensure this example stays up to date.

using Test
tol = 1E-6
@test termination_status(m) == MOI.LOCALLY_SOLVED
@test has_values(m)
@test u_opt isa Vector{<:Real}
@test J_opt isa Vector{<:Real}
@test isapprox(u_opt[end], 1.0000000088945395, atol=tol)
@test isapprox(x_opt[end], 31.441105707837544, atol=tol)
@test isapprox(J_opt[end], 106.80870543718251, atol=tol)
Test Passed

This page was generated using Literate.jl.